package co.gov.medellin.ssti.sub.model.dao.impl;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.support.GeneratedKeyHolder;

import co.gov.medellin.ssti.sub.common.util.Atributo;
import co.gov.medellin.ssti.sub.model.dao.ConsultasDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AreaVO;
import co.gov.medellin.ssti.sub.model.vo.ProgramaVO;
import co.gov.medellin.ssti.sub.model.vo.SedeVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.model.vo.ValorFlexibleVO;
import co.gov.medellin.ssti.sub.model.vo.VflexVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class ConsultasDAOImpl extends NamedParameterJdbcDaoSupport implements
		ConsultasDAO {

	@Override
	public Collection<ProgramaVO> findDetPrograma(String strCodigo)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = " SELECT pgr.NOMBRE Nombre, nvl(pgr.OBJETIVO,' ') Objetivo, "
				+ " nvl(pgr.DESCRIPCION,' ') Descripcion, nvl(area.NOMBRE,' ') Area, "
				+ " usu.codigo codusu, usu.NOMBRE Usuario, nvl(pgr.POBLACION_OBJETIVO,' ') Poblacion, "
				+ " nvl(to_char(pgr.desde_vigencia,'dd/mm/yyyy'),'nulo') Desde, "
				+ " nvl(to_char(pgr.hasta_vigencia,'dd/mm/yyyy'),'nulo')  Hasta, nvl(pgr.VIGENCIA,' ') Vigencia, "
				+ " pgr.CAMPO_A4 CAMPO_A4 "
				+ " FROM TCS_BEN_PROGRAMA pgr, TCS_BEN_AREA area, paoyer.tcs_usuario usu "
				+ " WHERE pgr.AREA_CODIGO = area.CODIGO "
				+ " AND pgr.USU_CODIGO = usu.CODIGO AND pgr.CODIGO = :pgr.CODIGO ";

		namedParameters.put("pgr.CODIGO", strCodigo);

		Collection<ProgramaVO> detPrograma = getNamedParameterJdbcTemplate()
				.query(strSql, namedParameters, new RowMapper<ProgramaVO>() {

					@Override
					public ProgramaVO mapRow(ResultSet rst, int rowNum)
							throws SQLException {
						ProgramaVO det = new ProgramaVO();
						det.setNombre(rst.getString("Nombre"));
						det.setObjetivo(rst.getString("Objetivo"));
						det.setDescripcion(rst.getString("Descripcion"));
						det.setNombreArea(rst.getString("Area"));
						det.setCodeUsuario(rst.getLong("codusu"));
						det.setNombreUsuario(rst.getString("Usuario"));
						det.setPoblacionObjetivo(rst.getString("Poblacion"));
						det.setDesdeVigencia(rst.getString("Desde"));
						det.setHastaVigencia(rst.getString("Hasta"));
						det.setVigencia(rst.getString("Vigencia"));
						det.setCampoA4(rst.getString("CAMPO_A4"));
						return det;
					}
				});

		return detPrograma;

	}

	@Override
	public Collection<SubprogramaVO> findDetSubpgr(String strSubpgr)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = " SELECT subpgr.nombre subprograma, pgr.NOMBRE programa,area.codigo codsecr, area.NOMBRE secretaria, nvl(subpgr.DESCRIPCION,' ') descripcion, "
				+ " nvl(TO_CHAR(subpgr.DIAS_REUTILIZAR),' ') utilizacion, nvl(subpgr.VALOR_UNITARIO_BENEFICIO,'0') valor, "
				+ " nvl(to_char(subpgr.desde_vigencia,'yyyy-mm-dd'),'nulo') desde, nvl(to_char(subpgr.hasta_vigencia,'yyyy-mm-dd'),'nulo') hasta, "
				+ " subpgr.grupo_familiar grupo, subpgr.validar_contra_estud estudiantes, "
				+ " subpgr.validar_contra_sisben sisben,  subpgr.VIGENCIA vigencia, usu.codigo codadmin, usu.NOMBRE usuario, "
				+ " subpgr.area_codigo subsecretaria,nvl(subpgr.CAMPO_A3,' ') renovar "
				+ " FROM TCS_BEN_SUBPROGRAMA subpgr, TCS_BEN_PROGRAMA pgr, TCS_BEN_AREA area, paoyer.tcs_usuario usu "
				+ " WHERE area.CODIGO = pgr.AREA_CODIGO AND usu.CODIGO = subpgr.USU_CODIGO "
				+ " AND pgr.CODIGO = subpgr.PRG_CODIGO AND subpgr.codigo = :subpgr.codigo ";

		namedParameters.put("subpgr.codigo", strSubpgr);
		Collection<SubprogramaVO> detSubprograma = getNamedParameterJdbcTemplate()
				.query(strSql, namedParameters, new RowMapper<SubprogramaVO>() {

					@Override
					public SubprogramaVO mapRow(ResultSet rst, int rowNum)
							throws SQLException {
						SubprogramaVO subprogramaVO = new SubprogramaVO();
						subprogramaVO.setNombre(rst.getString("subprograma"));
						subprogramaVO.setNombrePrograma(rst
								.getString("programa"));
						subprogramaVO.setCodeArea(rst.getLong("codsecr"));
						subprogramaVO.setNombreArea(rst.getString("secretaria"));
						subprogramaVO.setDescripcion(rst
								.getString("descripcion"));
						subprogramaVO.setDiasReutilizar(rst
								.getString("utilizacion"));
						subprogramaVO.setValorUnitarioBeneficio(rst
								.getString("valor"));
						subprogramaVO.setDesdeVigencia(rst.getString("desde"));
						subprogramaVO.setHastaVigencia(rst.getString("hasta"));
						subprogramaVO.setGrupoFamiliar(rst.getString("grupo"));
						subprogramaVO.setValidarEstud(rst
								.getString("estudiantes"));
						subprogramaVO.setValidarSisben(rst.getString("sisben"));
						subprogramaVO.setVigencia(rst.getString("vigencia"));
						subprogramaVO.setCodeUsuario(rst.getLong("codadmin"));
						subprogramaVO.setNombreUsuario(rst.getString("usuario"));
						subprogramaVO.setCodeArea(rst.getLong("subsecretaria"));
						// TODO: ???
						subprogramaVO.setDiasRenovacion(rst
								.getString("renovar"));
						return subprogramaVO;
					}
				});

		return detSubprograma;

	}

	@Override
	public Collection<SedeVO> findDetSede(String strSede) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = " SELECT sede.Nombre nombre, NVL(sede.Descripcion,' ') descripcion,  "
				+ " nvl(sede.tipo,' ') tipo, nvl(sede.caracter,' ') car, "
				+ " vfl_codigo_municipio.CODIGO  Municipio, nvl(sede.Direccion_Descriptiva,' ') dirdescrip, "
				+ " sede.Direccion_Encasillada direncas,nvl(sede.localizacion_cobama,' ')cobama, "
				+ " nvl(to_char(sede.desde_vigencia,'dd/mm/yyyy'),'nulo') desde, "
				+ " nvl(to_char(sede.hasta_vigencia,'dd/mm/yyyy'),'nulo') hasta, sede.vigencia vig "
				+ " FROM TCS_BEN_SEDE sede, paoyer.tcs_valor_flexible vfl_codigo_municipio "
				+ " WHERE sede.VFL_CODIGO_MUNICIPIO = vfl_codigo_municipio.CODIGO AND sede.codigo = :sede.codigo ";

		namedParameters.put("sede.codigo", strSede);

		Collection<SedeVO> sedes = getNamedParameterJdbcTemplate().query(
				strSql, namedParameters, new RowMapper<SedeVO>() {

					@Override
					public SedeVO mapRow(ResultSet rst, int rowNum)
							throws SQLException {
						SedeVO sedeVO = new SedeVO();
						sedeVO.setNombre(rst.getString("nombre"));
						sedeVO.setDescripcion(rst.getString("descripcion"));
						sedeVO.setTipo(rst.getString("tipo"));
						sedeVO.setCaracter(rst.getString("car"));
						sedeVO.setCodeMunicipio(rst.getLong("Municipio"));
						sedeVO.setDireccion_descriptiva(rst
								.getString("dirdescrip"));
						sedeVO.setDireccion_encasillada(rst
								.getString("direncas"));
						sedeVO.setLocalizacion_cobama(rst.getString("cobama"));
						sedeVO.setDesde(rst.getString("desde"));
						sedeVO.setHasta(rst.getString("hasta"));
						sedeVO.setVigencia(rst.getString("vig"));
						return sedeVO;
					}
				});

		return sedes;

	}

	@Override
	public Collection<ProgramaVO> findNamePrograma(Long codeUser,
			String groupUserName, Long areaUser) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT DISTINCT COD_PROGRAMA, NOM_PROGRAMA, DESC_PROGRAMA, OBJETIVO, POBLACION_OBJETIVO, COD_AREA, NOM_AREA, COD_USUARIO, NOM_USUARIO FROM VCS_BEN_PROG_WITHOUT_USUSEDE  ");

		if ((Object) codeUser != null) {
			query.append(" WHERE ('ADMINISTRADOR GENERAL' = :groupUserName "
					+ " OR 'SUPER USUARIO' = :groupUserName OR admSubpro = :codeUser "
					+ " OR admProg = :codeUser ");

			namedParameters.put("groupUserName", groupUserName);
			namedParameters.put("codeUser", codeUser);

			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR COD_AREA = :COD_AREA ");
				namedParameters.put("COD_AREA", areaUser);
			}
			query.append(" ) ");
		}
		query.append(" ORDER BY NOM_PROGRAMA");

		Collection<ProgramaVO> programas = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<ProgramaVO>() {

							@Override
							public ProgramaVO mapRow(ResultSet rst, int arg1)
									throws SQLException {
								ProgramaVO programaVO = new ProgramaVO();
								programaVO.setCode(rst.getLong("COD_PROGRAMA"));
								programaVO.setNombre(rst
										.getString("NOM_PROGRAMA"));
								programaVO.setDescripcion(rst
										.getString("DESC_PROGRAMA"));
								programaVO.setObjetivo(rst
										.getString("OBJETIVO"));
								programaVO.setPoblacionObjetivo(rst
										.getString("POBLACION_OBJETIVO"));
								programaVO.setCodeArea(rst.getLong("COD_AREA"));
								programaVO.setNombreArea(rst
										.getString("NOM_AREA"));
								programaVO.setCodeUsuario(rst
										.getLong("COD_USUARIO"));
								programaVO.setNombreUsuario(rst
										.getString("NOM_USUARIO"));
								return programaVO;
							}
						});

		return programas;

	}

	@Override
	public Collection<AreaVO> findNomSubsecretaria(String strCodSecret)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = " SELECT codigo, nombre FROM TCS_BEN_AREA WHERE area_codigo = :area_codigo ";

		namedParameters.put("area_codigo", strCodSecret);

		Collection<AreaVO> areas = getNamedParameterJdbcTemplate().query(
				strSql, namedParameters, new RowMapper<AreaVO>() {

					@Override
					public AreaVO mapRow(ResultSet rst, int rowNum)
							throws SQLException {
						AreaVO areaVO = new AreaVO();
						areaVO.setCode(rst.getLong("codigo"));
						areaVO.setNombre(rst.getString("nombre"));
						return areaVO;
					}
				});

		return areas;

	}

	@Override
	public Collection<UserVO> findUsuAdmin(String strUsu) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String codUsu = "%" + strUsu + "%";

		String strSql = "SELECT usu.codigo codigo, usu.nombre usuario, usu.descripcion nombre "
				+ " FROM paoyer.tcs_usuario usu, paoyer.tcs_grupo_usuario gusu "
				+ " WHERE usu.gus_codigo = gusu.codigo "
				+ "	AND fcs_val_vigencia(usu.vigencia, usu.desde_vigencia, usu.hasta_vigencia) = 'S' "
				+ "	AND usu.campo_a1 IS NULL "
				+ "	AND (usu.nombre LIKE upper(:codUsu) OR usu.descripcion LIKE upper(:codUsu))";

		namedParameters.put("codUsu", codUsu);

		Collection<UserVO> usuarios = getNamedParameterJdbcTemplate().query(
				strSql, namedParameters, new RowMapper<UserVO>() {

					@Override
					public UserVO mapRow(ResultSet rst, int arg1)
							throws SQLException {
						UserVO userVO = new UserVO();
						userVO.setCode(rst.getLong("codigo"));
						userVO.setName(rst.getString("usuario"));
						userVO.setDescription(rst.getString("nombre"));
						return userVO;
					}
				});

		return usuarios;
	}

	@Override
	public Collection<VflexVO> findMunicipios() throws DAOException {
		String strSql = " SELECT nombre,codigo FROM paoyer.TCS_VALOR_FLEXIBLE WHERE campo_a1 = '05' ";
		Collection<VflexVO> vflexVOs = getNamedParameterJdbcTemplate()
				.getJdbcOperations().query(strSql, new RowMapper<VflexVO>() {

					@Override
					public VflexVO mapRow(ResultSet rst, int arg1)
							throws SQLException {
						VflexVO vflexVO = new VflexVO();
						vflexVO.setNombreVflex(rst.getString("nombre"));
						vflexVO.setCode(rst.getLong("codigo"));
						return vflexVO;
					}
				});

		return vflexVOs;

	}

	@Override
	public int activarSub2(String[] param) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "UPDATE tcs_ben_subprograma "
				+ " SET vigencia = 'A', comentario = '', hasta_vigencia=hasta_vigencia+TO_NUMBER(hasta_vigencia-desde_vigencia), "
				+ " USUARIO_MODIFICA = :USUARIO_MODIFICA, FECHA_MODIFICA = TO_DATE(:FECHA_MODIFICA,'dd/mm/yyyy'), "
				+ " TERMINAL_MODIFICA = :TERMINAL_MODIFICA WHERE codigo = :codigo ";
		// user.getName(),dateFormat.format(c.getTime()),strTerminal, activar
		namedParameters.put("USUARIO_MODIFICA", param[0]);
		namedParameters.put("FECHA_MODIFICA", param[1]);
		namedParameters.put("TERMINAL_MODIFICA", param[2]);
		namedParameters.put("codigo", param[2]);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int activarPro2(String[] param) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "UPDATE tcs_ben_programa SET vigencia = 'A' , comentario = '', "
				+ " USUARIO_MODIFICA = :USUARIO_MODIFICA, FECHA_MODIFICA = TO_DATE(:FECHA_MODIFICA,'dd/mm/yyyy'), "
				+ " TERMINAL_MODIFICA = :TERMINAL_MODIFICA WHERE codigo = :codigo ";

		namedParameters.put("USUARIO_MODIFICA", param[0]);
		namedParameters.put("FECHA_MODIFICA", param[1]);
		namedParameters.put("TERMINAL_MODIFICA", param[2]);
		namedParameters.put("codigo", param[3]);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);

	}

	@Override
	public Collection<String> findNomPrg(String strcodpro) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT nombre FROM tcs_ben_programa WHERE codigo = :codigo ";

		namedParameters.put("codigo", strcodpro);

		Collection<String> noms = getNamedParameterJdbcTemplate().query(strSql,
				namedParameters, new RowMapper<String>() {

					@Override
					public String mapRow(ResultSet rst, int arg1)
							throws SQLException {
						return rst.getString("nombre");
					}
				});

		return noms;

	}

	@Override
	public Collection<SubprogramaVO> findInfoAct(String strsubprog)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = " SELECT  sub.PRG_CODIGO codprog,prog.NOMBRE programa, sub.nombre subprograma"
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog "
				+ " WHERE prog.VIGENCIA = 'I' AND sub.PRG_CODIGO = prog.CODIGO "
				+ " AND sub.CODIGO = :sub.CODIGO ";

		namedParameters.put("sub.CODIGO", strsubprog);

		Collection<SubprogramaVO> subprogramaVOs = getNamedParameterJdbcTemplate()
				.query(strSql, namedParameters, new RowMapper<SubprogramaVO>() {

					@Override
					public SubprogramaVO mapRow(ResultSet rst, int arg1)
							throws SQLException {
						SubprogramaVO subprogramaVO = new SubprogramaVO();
						subprogramaVO.setCodePrograma(rst.getLong("codprog"));
						subprogramaVO.setNombrePrograma(rst
								.getString("programa"));
						subprogramaVO.setNombre(rst.getString("subprograma"));
						return subprogramaVO;
					}
				});
		return subprogramaVOs;
	}

	@Override
	public boolean valProgActivo(String strsubprg) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = " SELECT prog.NOMBRE programa"
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog "
				+ " WHERE prog.VIGENCIA = 'I' AND sub.PRG_CODIGO = prog.CODIGO "
				+ " AND sub.CODIGO = :sub.CODIGO ";

		namedParameters.put("sub.CODIGO", strsubprg);

		try {
			getNamedParameterJdbcTemplate().queryForObject(strSql,
					namedParameters, String.class);
			return true;
		} catch (IncorrectResultSizeDataAccessException e) {
			return false;
		}

	}

	@Override
	public Collection<SubprogramaVO> findInfoAct2(String strSubprog)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = " SELECT prog.NOMBRE programa, sub.nombre subprograma "
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog  "
				+ " WHERE  sub.PRG_CODIGO = prog.CODIGO "
				+ " AND sub.CODIGO = :sub.CODIGO ";

		namedParameters.put("sub.CODIGO", strSubprog);

		Collection<SubprogramaVO> subprogramaVOs = getNamedParameterJdbcTemplate()
				.query(strSql, namedParameters, new RowMapper<SubprogramaVO>() {

					@Override
					public SubprogramaVO mapRow(ResultSet rst, int arg1)
							throws SQLException {
						SubprogramaVO subprogramaVO = new SubprogramaVO();
						subprogramaVO.setNombrePrograma(rst
								.getString("programa"));
						subprogramaVO.setNombre(rst.getString("subprograma"));
						return subprogramaVO;
					}
				});

		return subprogramaVOs;
	}

	@Override
	public String nombre(String strCod) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSQL = "SELECT ETIQUETA FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = :CODIGO ";
		int codigo = Integer.parseInt(strCod.trim());
		namedParameters.put("CODIGO", codigo);

		String nombre = getNamedParameterJdbcTemplate().queryForObject(strSQL,
				namedParameters, String.class);

		return nombre;

	}

	@Override
	public int findCodAtriEspe(String strCod) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSQL = "SELECT CAMPO_A1 FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = :CODIGO ";

		int codigo = Integer.parseInt(strCod.trim());
		namedParameters.put("CODIGO", codigo);

		Integer iCod = 0;
		try {
			iCod = getNamedParameterJdbcTemplate().queryForObject(strSQL,
					namedParameters, Integer.class);
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
		}
		return iCod == null ? 0 : iCod;
	}

	@Override
	public int findListaGeneral(String strCod) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSQL = "SELECT CODIGO FROM TCS_BEN_ATR_GENERICO WHERE TTVF_CODIGO_DOMINIO = :TTVF_CODIGO_DOMINIO ";
		int codigo = Integer.parseInt(strCod.trim());
		namedParameters.put("TTVF_CODIGO_DOMINIO", codigo);
		int iCod = 0;

		try {
			iCod = getNamedParameterJdbcTemplate().queryForObject(strSQL,
					namedParameters, Integer.class);
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
		}

		return iCod;
	}

	@Override
	public Collection<Atributo> findAtributoGenerico(String codsub)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int validar = validarEstudiante(codsub);
		int subprograma = Integer.parseInt(codsub.trim());

		String strSQL = "";

		if (validar == 1) {
			strSQL = "SELECT GEN.NOMBRE ATGNOMBRE, GEN.CODIGO ATGCODIGO, GEN.ETIQUETA ATGETIQUETA "
					+ " FROM TCS_BEN_ATR_GENERICO GEN "
					+ " WHERE  "
					+ " GEN.NOMBRE NOT IN (SELECT NOMBRE FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
					+ " WHERE SBPR_CODIGO = :SBPR_CODIGO ) ORDER BY GEN.ORDEN";
		} else {
			strSQL = "SELECT GEN.NOMBRE ATGNOMBRE, GEN.CODIGO ATGCODIGO, GEN.ETIQUETA ATGETIQUETA "
					+ " FROM TCS_BEN_ATR_GENERICO GEN "
					+ " WHERE  "
					+ " GEN.NOMBRE NOT IN (SELECT NOMBRE FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
					+ " WHERE SBPR_CODIGO = :SBPR_CODIGO "
					+ " ) "
					+ " AND (CAMPO_A2 IS NULL or CAMPO_A2 = 'S')  "
					+ " ORDER BY GEN.ORDEN";
		}
		namedParameters.put("SBPR_CODIGO", subprograma);

		List<Atributo> listaAtri = getNamedParameterJdbcTemplate().query(
				strSQL, namedParameters, new RowMapper<Atributo>() {

					@Override
					public Atributo mapRow(ResultSet rst, int arg1)
							throws SQLException {
						Atributo a = new Atributo();
						a.setCodigo(rst.getString("ATGCODIGO"));
						a.setNombre(rst.getString("ATGNOMBRE"));
						a.setEtiqueta(rst.getString("ATGETIQUETA"));
						return a;
					}
				});

		return listaAtri;
	}

	/**
	 * Metodo DEPRECADO ya no se usa para validar contra matricula en linea,
	 * siempre retorna 0.
	 * 
	 * @param codsubpro
	 * @return
	 */
	private int validarEstudiante(String codsubpro) {
		return 0;
	}

	@Override
	public Collection<Atributo> findAtributoEspecificos(String strSubprograma,
			int opcion) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int sub = Integer.parseInt(strSubprograma.trim());
		String strSQL;

		if (opcion != 1) {
			strSQL = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, nvl(REST_CODIGO,'0') REST_CODIGO, ORDEN, LONGITUD, "
					+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, VIGENCIA, "
					+ " DESCRIPCION, TIPO_DATO, TTVF_CODIGO_DOMINIO "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = :CODIGO ";
			namedParameters.put("CODIGO", sub);
		} else {
			strSQL = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, nvl(REST_CODIGO,'0') REST_CODIGO, ORDEN, LONGITUD, "
					+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, VIGENCIA, "
					+ " DESCRIPCION, TIPO_DATO, TTVF_CODIGO_DOMINIO "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = :SBPR_CODIGO AND VIGENCIA = 'A' ORDER BY ORDEN";
			namedParameters.put("SBPR_CODIGO", sub);
		}

		List<Atributo> listaAtriEsp = getNamedParameterJdbcTemplate().query(
				strSQL, namedParameters, new RowMapper<Atributo>() {

					@Override
					public Atributo mapRow(ResultSet rst, int arg1)
							throws SQLException {
						Atributo a1 = new Atributo();
						int res = rst.getInt("TTVF_CODIGO_DOMINIO");
						if (res != 0) {
							a1.setTipovalorflex(rst
									.getString("TTVF_CODIGO_DOMINIO"));
						} else {
							a1.setTipovalorflex("");
						}

						a1.setCodigo(rst.getString("CODIGO"));
						a1.setNombre(rst.getString("NOMBRE"));
						a1.setEtiqueta(rst.getString("ETIQUETA"));
						a1.setOrden(rst.getString("ORDEN"));
						a1.setRestriccion(rst.getString("REST_CODIGO"));
						a1.setValLista(rst.getString("VALIDAR_LISTA"));
						if (a1.getValLista().equals("S")) {
							a1.setValListaDesc("Si");
						} else {
							a1.setValListaDesc("No");
						}
						a1.setLongitud(rst.getString("LONGITUD"));

						a1.setObligatorio(rst.getString("OBLIGATORIO"));
						if (a1.getObligatorio().equals("S")) {
							a1.setObligarioDesc("Si");
						} else {
							a1.setObligarioDesc("No");
						}

						a1.setTipoatributo(rst.getString("TIPO_ATRIBUTO"));
						if (a1.getTipoatributo().equals("R")) {
							a1.setTipoatributoDesc("Beneficiario");
						} else {
							a1.setTipoatributoDesc("Beneficio");
						}

						a1.setValorsugerido(rst.getString("VALOR_SUGERIDO"));
						a1.setVigencia(rst.getString("VIGENCIA"));
						if (a1.getVigencia().equals("A")) {
							a1.setVigenciaDesc("Activo");
						} else {
							a1.setVigenciaDesc("Inactivo");
						}

						a1.setTipodato(rst.getString("TIPO_DATO"));
						if (a1.getTipodato().equals("A")) {
							a1.setTipodatoDesc("Alfanumerico");
						} else {
							if (a1.getTipodato().equals("F")) {
								a1.setTipodatoDesc("Fecha");
							} else {
								if (a1.getTipodato().equals("N")) {
									a1.setTipodatoDesc("Numérico");
								} else {
									a1.setTipodatoDesc("Solo Letras (A-Z)");
								}
							}

						}
						a1.setDescripcion(rst.getString("DESCRIPCION"));
						return a1;
					}
				});

		return listaAtriEsp;
	}

	@Override
	public Collection<ValorFlexibleVO> findDominio(String tipoVfl)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int dominio = Integer.parseInt(tipoVfl.trim());

		String strSQL = "SELECT TCS_VALOR_FLEXIBLE.CODIGO CODIGOVFL, TCS_TIPO_VALOR_FLEX.CODIGO TVFCOD, "
				+ " TCS_TIPO_VALOR_FLEX.DESCRIPCION TVFDES, TCS_TIPO_VALOR_FLEX.VIGENCIA TVFVIG, "
				+ " TCS_VALOR_FLEXIBLE.DESCRIPCION VFDES, TCS_VALOR_FLEXIBLE.TVF_CODIGO VFTVFCOD, "
				+ " TCS_VALOR_FLEXIBLE.CODIGO_VALOR CODIGO_VALOR "
				+ " FROM paoyer.TCS_TIPO_VALOR_FLEX, paoyer.TCS_VALOR_FLEXIBLE "
				+ " WHERE TCS_TIPO_VALOR_FLEX.CODIGO = :CODIGO AND TCS_VALOR_FLEXIBLE.TVF_CODIGO = :TVF_CODIGO "
				+ " AND TCS_VALOR_FLEXIBLE.VIGENCIA='S' "
				+ " ORDER BY CODIGO_VALOR ";

		namedParameters.put("CODIGO", dominio);
		namedParameters.put("TVF_CODIGO", dominio);

		List<ValorFlexibleVO> listaDominio = getNamedParameterJdbcTemplate()
				.query(strSQL, namedParameters,
						new RowMapper<ValorFlexibleVO>() {

							@Override
							public ValorFlexibleVO mapRow(ResultSet rst,
									int arg1) throws SQLException {
								ValorFlexibleVO valorfl = new ValorFlexibleVO();
								valorfl.setCodigotvfl(rst.getString("TVFCOD"));
								valorfl.settVFCodigo(rst.getString("VFTVFCOD"));
								valorfl.setDescripciontvfl(rst
										.getString("TVFDES"));
								valorfl.setDescripcionvf(rst.getString("VFDES"));
								valorfl.setVigenciatvfl(rst.getString("TVFVIG"));
								valorfl.setCodigovfl(rst.getString("CODIGOVFL"));
								valorfl.setCodigoValor(rst
										.getString("CODIGO_VALOR"));
								return valorfl;
							}
						});

		return listaDominio;

	}

	@Override
	public Collection<ValorFlexibleVO> findDominioByCritera(String tipoVfl,
			String nombre) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int dominio = Integer.parseInt(tipoVfl.trim());

		String strSQL = "SELECT TCS_VALOR_FLEXIBLE.CODIGO CODIGOVFL, TCS_TIPO_VALOR_FLEX.CODIGO TVFCOD, "
				+ " TCS_TIPO_VALOR_FLEX.DESCRIPCION TVFDES, TCS_TIPO_VALOR_FLEX.VIGENCIA TVFVIG, "
				+ " TCS_VALOR_FLEXIBLE.DESCRIPCION VFDES, TCS_VALOR_FLEXIBLE.TVF_CODIGO VFTVFCOD, "
				+ " TCS_VALOR_FLEXIBLE.CODIGO_VALOR CODIGO_VALOR "
				+ " FROM paoyer.TCS_TIPO_VALOR_FLEX, paoyer.TCS_VALOR_FLEXIBLE "
				+ " WHERE TCS_TIPO_VALOR_FLEX.CODIGO = :CODIGO AND TCS_VALOR_FLEXIBLE.TVF_CODIGO = :TVF_CODIGO "
				+ " AND TCS_VALOR_FLEXIBLE.VIGENCIA='S' "
				+ " AND TCS_VALOR_FLEXIBLE.DESCRIPCION LIKE :DESCRIPCION "
				+ " ORDER BY CODIGOVFL";

		namedParameters.put("CODIGO", dominio);
		namedParameters.put("TVF_CODIGO", dominio);
		namedParameters.put("DESCRIPCION", "%" + nombre + "%");

		Collection<ValorFlexibleVO> listaDominio = getNamedParameterJdbcTemplate()
				.query(strSQL, namedParameters,
						new RowMapper<ValorFlexibleVO>() {

							@Override
							public ValorFlexibleVO mapRow(ResultSet rst,
									int arg1) throws SQLException {
								ValorFlexibleVO valorfl = new ValorFlexibleVO();
								valorfl.setCodigotvfl(rst.getString("TVFCOD"));
								valorfl.settVFCodigo(rst.getString("VFTVFCOD"));
								valorfl.setDescripciontvfl(rst
										.getString("TVFDES"));
								valorfl.setDescripcionvf(rst.getString("VFDES"));
								valorfl.setVigenciatvfl(rst.getString("TVFVIG"));
								valorfl.setCodigovfl(rst.getString("CODIGOVFL"));
								valorfl.setCodigoValor(rst
										.getString("CODIGO_VALOR"));
								return valorfl;
							}
						});

		return listaDominio;

	}

	@Override
	public Collection<String> findTvflAtri(String codigo) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int iCodatri = Integer.parseInt(codigo.trim());

		String strSQL = "SELECT TTVF_CODIGO_DOMINIO, CAMPO_A1 FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = :CODIGO ";
		namedParameters.put("CODIGO", iCodatri);

		Collection<String> ret = new ArrayList<String>();

		List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
				.queryForList(strSQL, namedParameters);
		for (Map<String, Object> row : rows) {
			String codDominio = (String) row.get("TTVF_CODIGO_DOMINIO");
			String campoA1 = (String) row.get("CAMPO_A1");
			ret.add(codDominio);
			ret.add(campoA1);
		}
		return ret;

	}

	@Override
	public Collection<Atributo> findAtriValidarLista(List<String> lNombre,
			String strSubprograma) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int sub = Integer.parseInt(strSubprograma.trim());
		int iTam = lNombre.size();

		// String parte1 = "IN(";
		String parte2 = "";
		for (int i = 0; i < iTam; i++) {
			String b = (String) lNombre.get(i);
			if (i < iTam - 1) {
				parte2 += " UPPER(:b), ";
				namedParameters.put("b", b);
			} else {
				parte2 += " UPPER(:b)) ";
				namedParameters.put("b", b);
			}

		}
		// parte1 = parte1 + parte2;

		String strSQL = "SELECT CODIGO, ETIQUETA, VALIDAR_LISTA FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = :SBPR_CODIGO "
				+ " AND NOMBRE IN( " + parte2 + " AND VALIDAR_LISTA='S' ";

		namedParameters.put("SBPR_CODIGO", sub);

		Collection<Atributo> lDominio = getNamedParameterJdbcTemplate().query(
				strSQL, namedParameters, new RowMapper<Atributo>() {

					@Override
					public Atributo mapRow(ResultSet rst, int arg1)
							throws SQLException {
						Atributo a1 = new Atributo();
						a1.setCodigo(rst.getString("CODIGO"));
						a1.setEtiqueta(rst.getString("ETIQUETA"));
						a1.setValLista(rst.getString("VALIDAR_LISTA"));
						return a1;
					}
				});

		return lDominio;
	}

	@Override
	public Collection<Atributo> findAtriValidarLista2(List<String> lNombre,
			String strSubprograma) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int sub = Integer.parseInt(strSubprograma.trim());

		String strSQL = "SELECT CODIGO, ETIQUETA, VALIDAR_LISTA FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = :SBPR_CODIGO "
				+ " AND VALIDAR_LISTA='S' AND TTVF_CODIGO_DOMINIO IS NULL";

		namedParameters.put("SBPR_CODIGO", sub);

		Collection<Atributo> lDominio = getNamedParameterJdbcTemplate().query(
				strSQL, namedParameters, new RowMapper<Atributo>() {

					@Override
					public Atributo mapRow(ResultSet rst, int arg1)
							throws SQLException {
						Atributo a1 = new Atributo();
						a1.setCodigo(rst.getString("CODIGO"));
						a1.setEtiqueta(rst.getString("ETIQUETA"));
						a1.setValLista(rst.getString("VALIDAR_LISTA"));
						return a1;
					}
				});

		return lDominio;
	}

	@Override
	public int insertAtributo(String[] strArr, String strSubprograma)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int sub = Integer.parseInt(strSubprograma.trim());
		String strSql = "INSERT INTO TCS_BEN_SUBP_ATR_BENEFICIARIO (CODIGO, SBPR_CODIGO, "
				+ " TIPO_ATRIBUTO, NOMBRE, DESCRIPCION, ORDEN, TIPO_DATO, LONGITUD, "
				+ " OBLIGATORIO, ETIQUETA, VALIDAR_LISTA, VIGENCIA, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " VALUES(SCS_BEN_SAB.NEXTVAL, :SBPR_CODIGO, :TIPO_ATRIBUTO, UPPER(:NOMBRE), "
				+ " UPPER(:DESCRIPCION), :ORDEN, :TIPO_DATO, :LONGITUD, :OBLIGATORIO, UPPER(:ETIQUETA), "
				+ " :VALIDAR_LISTA, 'A', :usuario_crea, TO_DATE(:fecha_crea,'dd/mm/yyyy'), :terminal_crea, "
				+ " :usuario_modifica, TO_DATE(:fecha_modifica,'dd/mm/yyyy'), :terminal_modifica)";

		namedParameters.put("SBPR_CODIGO", sub);
		namedParameters.put("TIPO_ATRIBUTO", strArr[0]);
		namedParameters.put("NOMBRE", strArr[1]);
		namedParameters.put("DESCRIPCION", strArr[2]);
		namedParameters.put("ORDEN", strArr[3]);
		namedParameters.put("TIPO_DATO", strArr[4]);
		namedParameters.put("LONGITUD", strArr[5]);
		namedParameters.put("OBLIGATORIO", strArr[6]);
		namedParameters.put("ETIQUETA", strArr[7]);
		namedParameters.put("VALIDAR_LISTA", strArr[8]);
		namedParameters.put("usuario_crea", strArr[9]);
		namedParameters.put("fecha_crea", strArr[10]);
		namedParameters.put("terminal_crea", strArr[11]);
		namedParameters.put("usuario_modifica", strArr[12]);
		namedParameters.put("fecha_modifica", strArr[13]);
		namedParameters.put("terminal_modifica", strArr[14]);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int insertAtributo2(String[] strArrAG, String strSubprograma)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int sub = Integer.parseInt(strSubprograma.trim());
		String strSql = "INSERT INTO TCS_BEN_SUBP_ATR_BENEFICIARIO (CODIGO, SBPR_CODIGO, TIPO_ATRIBUTO, "
				+ " NOMBRE, ORDEN, LONGITUD, OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
				+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO, CAMPO_A2, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " VALUES ( SCS_BEN_SAB.NEXTVAL, :SBPR_CODIGO "
				+ ", :TIPO_ATRIBUTO, UPPER(:NOMBRE), :ORDEN, :LONGITUD, :OBLIGATORIO, :ETIQUETA, UPPER(:VALOR_SUGERIDO), "
				+ " :VALIDAR_LISTA, :VIGENCIA, :TTVF_CODIGO_DOMINIO, :DESCRIPCION, UPPER(:TIPO_DATO), :CAMPO_A2, "
				+ " :usuario_crea, TO_DATE(:fecha_crea,'dd/mm/yyyy'), :terminal_crea, :usuario_modifica, TO_DATE(:fecha_modifica,'dd/mm/yyyy'), :terminal_modifica)";

		namedParameters.put("SBPR_CODIGO", sub);
		namedParameters.put("TIPO_ATRIBUTO", strArrAG[0]);
		namedParameters.put("NOMBRE", strArrAG[1]);
		namedParameters.put("ORDEN", strArrAG[2]);
		namedParameters.put("LONGITUD", strArrAG[3]);
		namedParameters.put("OBLIGATORIO", strArrAG[4]);
		namedParameters.put("ETIQUETA", strArrAG[5]);
		namedParameters.put("VALOR_SUGERIDO", strArrAG[6]);
		namedParameters.put("VALIDAR_LISTA", strArrAG[7]);
		namedParameters.put("VIGENCIA", strArrAG[8]);
		namedParameters.put("TTVF_CODIGO_DOMINIO", strArrAG[9]);
		namedParameters.put("DESCRIPCION", strArrAG[10]);
		namedParameters.put("TIPO_DATO", strArrAG[11]);
		namedParameters.put("CAMPO_A2", strArrAG[12]);
		namedParameters.put("usuario_crea", strArrAG[13]);
		namedParameters.put("fecha_crea", strArrAG[14]);
		namedParameters.put("terminal_crea", strArrAG[15]);
		namedParameters.put("usuario_modifica", strArrAG[16]);
		namedParameters.put("fecha_modifica", strArrAG[17]);
		namedParameters.put("terminal_modifica", strArrAG[18]);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int insertAtributoGenerico(String strCodigo, String strSubprograma,
			String[] strArr2) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT TIPO_ATRIBUTO, NOMBRE, DESCRIPCION, ORDEN, TIPO_DATO, "
				+ " LONGITUD, OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, "
				+ " VALIDAR_LISTA, VIGENCIA, TTVF_CODIGO_DOMINIO, CAMPO_A2 "
				+ " FROM TCS_BEN_ATR_GENERICO WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", strCodigo);

		String strTipoAtributo = null;
		String strNombre = null;
		String strOrden = null;
		String strLongitud = null;
		String strObligatorio = null;
		String strEtiqueta = null;
		String strValidarLista = null;
		String strDescripcion = null;
		String strTipoDato = null;
		String strValorSugerido = null;
		String strVigencia = null;
		String strTVflCodigo = null;
		String strCampoA2 = null;

		List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
				.queryForList(strSql, namedParameters);
		for (Map<String, Object> row : rows) {
			strTipoAtributo = (String) row.get("TIPO_ATRIBUTO");
			strNombre = (String) row.get("NOMBRE");
			BigDecimal orden = (BigDecimal) row.get("ORDEN");
			if (orden != null) {
				strOrden = Long.toString(orden.longValue());
			}
			BigDecimal longitud = (BigDecimal) row.get("LONGITUD");
			if (longitud != null) {
				strLongitud = Integer.toString(longitud.intValue());
			}
			strObligatorio = (String) row.get("OBLIGATORIO");
			strEtiqueta = (String) row.get("ETIQUETA");
			strValidarLista = (String) row.get("VALIDAR_LISTA");
			strDescripcion = (String) row.get("DESCRIPCION");
			strTipoDato = (String) row.get("TIPO_DATO");
			strValorSugerido = (String) row.get("VALOR_SUGERIDO");
			strVigencia = (String) row.get("VIGENCIA");
			BigDecimal codigoDominio = (BigDecimal) row
					.get("TTVF_CODIGO_DOMINIO");
			if (codigoDominio != null) {
				strTVflCodigo = Integer.toString(codigoDominio.intValue());
			}
			strCampoA2 = (String) row.get("CAMPO_A2");
		}

		String strArrAG[] = { strTipoAtributo, strNombre, strOrden,
				strLongitud, strObligatorio, strEtiqueta, strValorSugerido,
				strValidarLista, strVigencia, strTVflCodigo, strDescripcion,
				strTipoDato, strCampoA2, strArr2[0], strArr2[1], strArr2[2],
				strArr2[3], strArr2[4], strArr2[5] };

		return insertAtributo2(strArrAG, strSubprograma);
	}

	@Override
	public int insertTipoVFL(String[] strArr) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "INSERT INTO paoyer.TCS_TIPO_VALOR_FLEX (CODIGO, NOMBRE, "
				+ " DESCRIPCION, VIGENCIA,CODIGO_VALOR_AUT, APL_CODIGO, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " VALUES(paoyer.SCS_TIPO_VALOR_FLEX.NEXTVAL, UPPER(:NOMBRE), UPPER(:DESCRIPCION), :VIGENCIA, 'S', 20, :usuario_crea, TO_DATE(:fecha_crea, 'dd/mm/yyyy'), :terminal_crea, :usuario_modifica, TO_DATE(:fecha_modifica, 'dd/mm/yyyy'), :terminal_modifica)";

		namedParameters.put("NOMBRE", strArr[0]);
		namedParameters.put("DESCRIPCION", strArr[1]);
		namedParameters.put("VIGENCIA", strArr[2]);
		namedParameters.put("usuario_crea", strArr[3]);
		namedParameters.put("fecha_crea", strArr[4]);
		namedParameters.put("terminal_crea", strArr[5]);
		namedParameters.put("usuario_modifica", strArr[6]);
		namedParameters.put("fecha_modifica", strArr[7]);
		namedParameters.put("terminal_modifica", strArr[8]);

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
		SqlParameterSource parameterSource = new MapSqlParameterSource(
				namedParameters);

		getNamedParameterJdbcTemplate().update(strSql, parameterSource,
				generatedKeyHolder, new String[] { "CODIGO" });

		return generatedKeyHolder.getKey().intValue();
	}

	@Override
	public int insertAtributoGene(String[] strArr) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "INSERT INTO TCS_BEN_ATR_GENERICO(CODIGO, TIPO_ATRIBUTO, "
				+ " NOMBRE, DESCRIPCION,ORDEN, TIPO_DATO, LONGITUD, OBLIGATORIO, "
				+ " ETIQUETA, VALIDAR_LISTA, VIGENCIA, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " VALUES(SCS_BEN_ATGE.NEXTVAL, "
				+ " :TIPO_ATRIBUTO, "
				+ " UPPER(:NOMBRE), "
				+ " UPPER(:DESCRIPCION), "
				+ " :ORDEN, "
				+ " :TIPO_DATO, "
				+ " :LONGITUD, "
				+ " :OBLIGATORIO, "
				+ " UPPER(:ETIQUETA), "
				+ " :VALIDAR_LISTA, 'A', "
				+ " :usuario_crea, "
				+ " TO_DATE(:fecha_crea, 'dd/mm/yyyy'), "
				+ " :terminal_crea, :usuario_modifica, "
				+ " TO_DATE(:fecha_modifica, 'dd/mm/yyyy'), "
				+ " :terminal_modifica)";

		namedParameters.put("TIPO_ATRIBUTO", strArr[0]);
		namedParameters.put("NOMBRE", strArr[1]);
		namedParameters.put("DESCRIPCION", strArr[2]);
		namedParameters.put("ORDEN", strArr[3]);
		namedParameters.put("TIPO_DATO", strArr[4]);
		namedParameters.put("LONGITUD", strArr[5]);
		namedParameters.put("OBLIGATORIO", strArr[6]);
		namedParameters.put("ETIQUETA", strArr[7]);
		namedParameters.put("VALIDAR_LISTA", strArr[8]);
		namedParameters.put("usuario_crea", strArr[9]);
		namedParameters.put("fecha_crea", strArr[10]);
		namedParameters.put("terminal_crea", strArr[11]);
		namedParameters.put("usuario_modifica", strArr[12]);
		namedParameters.put("fecha_modifica", strArr[13]);
		namedParameters.put("terminal_modifica", strArr[14]);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int insertValorVFL(String[] strArr, int codigo) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = " INSERT INTO paoyer.TCS_VALOR_FLEXIBLE (CODIGO, NOMBRE, DESCRIPCION, VIGENCIA, TVF_CODIGO, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica, CODIGO_VALOR) "
				+ " VALUES(paoyer.SCS_VALOR_FLEXIBLE.NEXTVAL, "
				+ " UPPER(:NOMBRE), "
				+ " UPPER(:DESCRIPCION), 'S', "
				+ " :TVF_CODIGO "
				+ ", :usuario_crea, "
				+ " TO_DATE(:fecha_crea, 'dd/mm/yyyy'), "
				+ " :terminal_crea, "
				+ " :usuario_modifica, "
				+ " TO_DATE(:fecha_modifica, 'dd/mm/yyyy'), "
				+ " :terminal_modifica, " + " :CODIGO_VALOR)";

		namedParameters.put("NOMBRE", strArr[0]);
		namedParameters.put("DESCRIPCION", strArr[1]);
		namedParameters.put("TVF_CODIGO", codigo);
		namedParameters.put("usuario_crea", strArr[2]);
		namedParameters.put("fecha_crea", strArr[3]);
		namedParameters.put("terminal_crea", strArr[4]);
		namedParameters.put("usuario_modifica", strArr[5]);
		namedParameters.put("fecha_modifica", strArr[6]);
		namedParameters.put("terminal_modifica", strArr[7]);
		namedParameters.put("CODIGO_VALOR", strArr[8]);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int findCodigoTipoVFL() throws DAOException {
		String strSql = " SELECT MAX(CODIGO) CODIGO FROM paoyer.TCS_TIPO_VALOR_FLEX";

		return getNamedParameterJdbcTemplate().getJdbcOperations()
				.queryForObject(strSql, Integer.class);

	}

	@Override
	public int findOrdenAtriGene() throws DAOException {
		int codigo = 0;
		String strSql = " SELECT MAX(ORDEN) ORDEN FROM TCS_BEN_ATR_GENERICO";
		Integer ret;
		try {
			ret = getNamedParameterJdbcTemplate().getJdbcOperations()
					.queryForObject(strSql, Integer.class);
			codigo = ret + 5;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
		}

		return codigo;
	}

	@Override
	public Collection<String> findCodMaxAtriGene() throws DAOException {
		List<String> codigo = new ArrayList<String>();
		String strSql = " SELECT MAX(SAB.CODIGO) CODIGOATE, MAX(ATG.CODIGO) CODIGOATG "
				+ " FROM TCS_BEN_ATR_GENERICO ATG, TCS_BEN_SUBP_ATR_BENEFICIARIO SAB";

		List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
				.getJdbcOperations().queryForList(strSql);

		for (Map<String, Object> row : rows) {
			codigo.add((String) row.get("CODIGOATE"));
			codigo.add((String) row.get("CODIGOATG"));
		}
		return codigo;
	}

	@Override
	public int findOrden(String orden, String subprograma, String vigencia)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int iOrden = Integer.parseInt(orden.trim());
		int iSubpro = Integer.parseInt(subprograma.trim());

		String strSql = " SELECT CODIGO FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE ORDEN = :ORDEN "
				+ " AND SBPR_CODIGO = :SBPR_CODIGO AND VIGENCIA = :VIGENCIA ";

		namedParameters.put("ORDEN", iOrden);
		namedParameters.put("SBPR_CODIGO", iSubpro);
		namedParameters.put("VIGENCIA", vigencia);

		try {
			return getNamedParameterJdbcTemplate().queryForObject(strSql,
					namedParameters, Integer.class);
		} catch (IncorrectResultSizeDataAccessException e) {
			return 0;
		}
	}

	@Override
	public int findOrden(String orden, String subprograma) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int iOrden = Integer.parseInt(orden.trim());
		int iSubpro = Integer.parseInt(subprograma.trim());

		String strSql = " SELECT CODIGO FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE ORDEN = :ORDEN AND SBPR_CODIGO = :SBPR_CODIGO ";

		namedParameters.put("ORDEN", iOrden);
		namedParameters.put("SBPR_CODIGO", iSubpro);

		try {
			return getNamedParameterJdbcTemplate().queryForObject(strSql,
					namedParameters, Integer.class);
		} catch (IncorrectResultSizeDataAccessException e) {
			return 0;
		}
	}

	@Override
	public int findNombre(String nombre, String subprograma, String vigencia)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int iSubpro = Integer.parseInt(subprograma.trim());
		int opcion;
		String strSql = " SELECT NOMBRE FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE NOMBRE = :NOMBRE "
				+ " AND SBPR_CODIGO = :SBPR_CODIGO AND VIGENCIA = :VIGENCIA ";

		namedParameters.put("NOMBRE", nombre);
		namedParameters.put("SBPR_CODIGO", iSubpro);
		namedParameters.put("VIGENCIA", vigencia);

		try {
			getNamedParameterJdbcTemplate().queryForObject(strSql,
					namedParameters, String.class);
			opcion = 1;
		} catch (IncorrectResultSizeDataAccessException e) {
			opcion = 0;
		}
		return opcion;
	}

	@Override
	public int findNombre(String nombre, String subprograma)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int iSubpro = Integer.parseInt(subprograma.trim());
		int opcion;
		String strSql = " SELECT NOMBRE FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE NOMBRE = :NOMBRE AND SBPR_CODIGO = :SBPR_CODIGO ";

		namedParameters.put("NOMBRE", nombre);
		namedParameters.put("SBPR_CODIGO", iSubpro);
		try {
			getNamedParameterJdbcTemplate().queryForObject(strSql,
					namedParameters, String.class);
			opcion = 1;
		} catch (IncorrectResultSizeDataAccessException e) {
			opcion = 0;
		}
		return opcion;
	}

	@Override
	public int actualizarAtributo(String strCodigoAtri, int iCodigo,
			String[] strArrAct) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int codatri = Integer.parseInt(strCodigoAtri.trim());
		String strSql = " UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ " TTVF_CODIGO_DOMINIO = :TTVF_CODIGO_DOMINIO, usuario_modifica = :usuario_modifica, "
				+ " fecha_modifica = TO_DATE(:fecha_modifica, 'dd/mm/yyyy'), "
				+ " terminal_modifica = :terminal_modifica WHERE CODIGO = :CODIGO ";

		namedParameters.put("TTVF_CODIGO_DOMINIO", iCodigo);
		namedParameters.put("usuario_modifica", strArrAct[0]);
		namedParameters.put("fecha_modifica", strArrAct[1]);
		namedParameters.put("terminal_modifica", strArrAct[2]);
		namedParameters.put("CODIGO", codatri); // codigo

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int actualizarAtributoGene(int iCodigoAtri, int iCodigo,
			String[] strArrAct) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int actualizo = 0;
		String strSql = "UPDATE TCS_BEN_ATR_GENERICO SET "
				+ " TTVF_CODIGO_DOMINIO = :TTVF_CODIGO_DOMINIO, usuario_modifica = :usuario_modifica,"
				+ " fecha_modifica = TO_DATE(:fecha_modifica, 'dd/mm/yyyy'), "
				+ " terminal_modifica = :terminal_modifica WHERE CODIGO = :CODIGO ";

		namedParameters.put("TTVF_CODIGO_DOMINIO", iCodigo);
		namedParameters.put("usuario_modifica", strArrAct[0]);
		namedParameters.put("fecha_modifica", strArrAct[1]);
		namedParameters.put("terminal_modifica", strArrAct[2]);
		namedParameters.put("CODIGO", iCodigoAtri);

		actualizo = getNamedParameterJdbcTemplate().update(strSql,
				namedParameters);

		return actualizo;
	}

	@Override
	public int actualizarCampoUno(int iCodAtriEsp, int iCodAtriGene)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int actualizo = 0;
		String strSql = " UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET CAMPO_A1 = :CAMPO_A1 WHERE CODIGO = :CODIGO ";

		namedParameters.put("CAMPO_A1", iCodAtriGene);
		namedParameters.put("CODIGO", iCodAtriEsp);

		actualizo = getNamedParameterJdbcTemplate().update(strSql,
				namedParameters);

		return actualizo;
	}

	@Override
	public int actualizarValorSug(String strCodigoAtri, String strCodigoVFL,
			String[] strArrAct) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int actualizo = 0;
		int codatri = Integer.parseInt(strCodigoAtri.trim());
		String strSql = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ " VALOR_SUGERIDO = :VALOR_SUGERIDO, usuario_modifica = :usuario_modifica,"
				+ " fecha_modifica = TO_DATE(:fecha_modifica, 'dd/mm/yyyy'), "
				+ " terminal_modifica = :terminal_modifica WHERE CODIGO = :CODIGO ";

		namedParameters.put("VALOR_SUGERIDO", strCodigoVFL);
		namedParameters.put("usuario_modifica", strArrAct[0]);
		namedParameters.put("fecha_modifica", strArrAct[1]);
		namedParameters.put("terminal_modifica", strArrAct[2]);
		namedParameters.put("CODIGO", codatri);

		actualizo = getNamedParameterJdbcTemplate().update(strSql,
				namedParameters);

		return actualizo;
	}

	@Override
	public int actualizarValorSugGene(int CodigoAtriGe, String strCodigoVFL)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int actualizo = 0;
		String strSql = "UPDATE TCS_BEN_ATR_GENERICO SET VALOR_SUGERIDO = :VALOR_SUGERIDO WHERE CODIGO = :CODIGO ";

		namedParameters.put("VALOR_SUGERIDO", strCodigoVFL);
		namedParameters.put("CODIGO", CodigoAtriGe);

		actualizo = getNamedParameterJdbcTemplate().update(strSql,
				namedParameters);

		return actualizo;
	}

	@Override
	public int eliminarAtri(String strCodigoAtri, String[] strArrAct)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int actualizo = 0;
		int codatri = Integer.parseInt(strCodigoAtri.trim());
		String strSql = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ " VIGENCIA = 'I', usuario_modifica = :usuario_modifica, "
				+ " fecha_modifica = TO_DATE(:fecha_modifica, 'dd/mm/yyyy'), "
				+ " terminal_modifica = :terminal_modifica WHERE CODIGO = :CODIGO ";

		namedParameters.put("usuario_modifica", strArrAct[0]);
		namedParameters.put("fecha_modifica", strArrAct[1]);
		namedParameters.put("terminal_modifica", strArrAct[2]);
		namedParameters.put("CODIGO", codatri);

		actualizo = getNamedParameterJdbcTemplate().update(strSql,
				namedParameters);
		return actualizo;
	}

	@Override
	public int modificarAtriSub(Atributo atri, String[] strArrAct)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int actualizo = 0;
		String strSql = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ " NOMBRE = UPPER(:NOMBRE), ORDEN = :ORDEN, LONGITUD = :LONGITUD, "
				+ " OBLIGATORIO = :OBLIGATORIO, ETIQUETA = UPPER(:ETIQUETA), "
				+ " VALOR_SUGERIDO = :VALOR_SUGERIDO, VALIDAR_LISTA = :VALIDAR_LISTA, "
				+ " VIGENCIA = :VIGENCIA, DESCRIPCION = UPPER(:DESCRIPCION), "
				+ " usuario_modifica = :usuario_modifica,"
				+ " fecha_modifica = TO_DATE(:fecha_modifica,'dd/mm/yyyy'), "
				+ " terminal_modifica = :terminal_modifica WHERE CODIGO = :CODIGO ";

		namedParameters.put("NOMBRE", atri.getNombre());
		namedParameters.put("ORDEN", atri.getOrden());
		namedParameters.put("LONGITUD", atri.getLongitud());
		namedParameters.put("OBLIGATORIO", atri.getObligatorio());
		namedParameters.put("ETIQUETA", atri.getEtiqueta());
		namedParameters.put("VALOR_SUGERIDO", atri.getValorsugerido());
		namedParameters.put("VALIDAR_LISTA", atri.getValLista());
		namedParameters.put("VIGENCIA", atri.getVigencia());
		namedParameters.put("DESCRIPCION", atri.getDescripcion());
		namedParameters.put("usuario_modifica", strArrAct[0]);
		namedParameters.put("fecha_modifica", strArrAct[1]);
		namedParameters.put("terminal_modifica", strArrAct[2]);
		namedParameters.put("CODIGO", atri.getCodatributo());

		actualizo = getNamedParameterJdbcTemplate().update(strSql,
				namedParameters);

		namedParameters.clear();

		SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getDataSource())
				.withSchemaName("BENEFICIOS").withProcedureName(
						"PCS_CHANGE_DATA_TYPE");

		namedParameters.put("newDataType", atri.getTipodato());
		namedParameters.put("codeAtr", atri.getCodatributo());

		SqlParameterSource in = new MapSqlParameterSource(namedParameters);
		BigDecimal bigDecimal = jdbcCall.executeObject(BigDecimal.class, in);

		if (bigDecimal.intValue() != 1) {
			actualizo = -1;
		}

		namedParameters.clear();

		SimpleJdbcCall jdbcCall2 = new SimpleJdbcCall(getDataSource())
				.withSchemaName("BENEFICIOS").withProcedureName(
						"PCS_CHANGE_ATRIBUTE_TYPE");

		namedParameters.put("newAtrType", atri.getTipoatributo());
		namedParameters.put("codeAtr", atri.getCodatributo());
		namedParameters.put("v_usuario", strArrAct[0]);
		namedParameters.put("v_terminal", strArrAct[2]);

		SqlParameterSource in2 = new MapSqlParameterSource(namedParameters);
		BigDecimal bigDecimal2 = jdbcCall2.executeObject(BigDecimal.class, in2);

		if (bigDecimal2.intValue() != 1) {
		} else {
			actualizo = -2;
		}

		return actualizo;
	}

	@Override
	public int actualizarTvfDominio(String atri) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int codatri = Integer.parseInt(atri.trim());
		String strSql = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ "TTVF_CODIGO_DOMINIO='', VALOR_SUGERIDO='', "
				+ "CAMPO_A1='' WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", codatri);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int actualizarDominio(String[] strArr, String codigo)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int codtvfl = Integer.parseInt(codigo.trim());
		String strSql = "UPDATE paoyer.TCS_TIPO_VALOR_FLEX SET "
				+ " NOMBRE = upper(:NOMBRE), DESCRIPCION = UPPER(:DESCRIPCION), "
				+ " VIGENCIA = :VIGENCIA, usuario_modifica = :usuario_modifica, "
				+ " fecha_modifica = TO_DATE(:fecha_modifica,'dd/mm/yyyy'), "
				+ " TERMINAL_MODIFICA = :TERMINAL_MODIFICA WHERE CODIGO = :CODIGO ";

		namedParameters.put("NOMBRE", strArr[0]);
		namedParameters.put("DESCRIPCION", strArr[1]);
		namedParameters.put("VIGENCIA", strArr[2]);
		namedParameters.put("usuario_modifica", strArr[3]);
		namedParameters.put("fecha_modifica", strArr[4]);
		namedParameters.put("TERMINAL_MODIFICA", strArr[5]);
		namedParameters.put("CODIGO", codtvfl);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int actualizarValorFlexible(String[] strArr, String codigo)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int codvfl = Integer.parseInt(codigo.trim());
		String strSql = "UPDATE paoyer.TCS_VALOR_FLEXIBLE SET "
				+ " NOMBRE = upper(:NOMBRE), DESCRIPCION = upper(:DESCRIPCION), "
				+ " VIGENCIA = :VIGENCIA, usuario_modifica = :usuario_modifica,"
				+ " fecha_modifica = TO_DATE(:fecha_modifica, 'dd/mm/yyyy'), "
				+ " terminal_modifica = :terminal_modifica, codigo_valor = :codigo_valor "
				+ " WHERE CODIGO = :CODIGO ";

		namedParameters.put("NOMBRE", strArr[0]);
		namedParameters.put("DESCRIPCION", strArr[1]);
		namedParameters.put("VIGENCIA", strArr[2]);
		namedParameters.put("usuario_modifica", strArr[3]);
		namedParameters.put("fecha_modifica", strArr[4]);
		namedParameters.put("terminal_modifica", strArr[5]);
		namedParameters.put("codigo_valor", strArr[6]);
		namedParameters.put("CODIGO", codvfl);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int eliminarVFL(String codigo) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int codvfl = Integer.parseInt(codigo.trim());
		String strSql = "UPDATE paoyer.TCS_VALOR_FLEXIBLE SET "
				+ " VIGENCIA='N' WHERE CODIGO = :CODIGO ";
		namedParameters.put("CODIGO", codvfl);
		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}

	@Override
	public int eliminarVFLTotal(String codigo) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int codtvfl = Integer.parseInt(codigo.trim());
		String strSql = "UPDATE paoyer.TCS_VALOR_FLEXIBLE SET "
				+ " VIGENCIA='N' WHERE TVF_CODIGO = :TVF_CODIGO ";
		namedParameters.put("TVF_CODIGO", codtvfl);

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);

	}

}
